package com.leo.manage_system.utils;

import static com.baomidou.mybatisplus.core.toolkit.StringUtils.isEmpty;


/**
 * @Author: ywzjks
 * @Date: 2021/12/19 15:31
 * @Description:
 */
public class StringUtil {
    /**
     * 获取字符串下标
     *
     * @param str   字符串
     * @param index 下标，允许存在正负值，负值表示从后取值
     * @return 下标字符
     */
    public static char charAt(CharSequence str, int index) {
        if (index >= 0) {
            if (index > str.length() - 1) {
                return 0;
            }
            return str.charAt(index);
        } else {
            index = str.length() + index;
            if (index > 0) {
                return str.charAt(index);
            } else {
                return 0;
            }
        }
    }

    /**
     * 实现类似Python的字符串切片功能
     *
     * @param str        String
     * @param startIndex 开始的index（包括）
     * @param endIndex   结束的index（不包括）
     * @param step       步长,正值表示从左到右取值，负值表示从右到左取值,不能为0
     * @return 字符串
     */
    public static String sub(CharSequence str, Integer startIndex, Integer endIndex, int step) {
        if (isEmpty(str)) {
            return "";
        }
        if (step == 0) {
            return "";
        } else if (step < 0) {
            // 从右往左取值，而startIndex省略时，表示从端点开始，因此这里的端点是“终点”
            if (startIndex == null) {
                startIndex = str.length() - 1;
            } else if (startIndex < 0) {
                startIndex = str.length() + startIndex;
            }
            if (endIndex == null) {
                endIndex = -1;
            } else if (endIndex < 0) {
                endIndex = str.length() + endIndex;
            }
        } else {
            // 从左往右取值，而startIndex省略时，表示从端点开始，因此这里的端点是“起点”
            if (startIndex == null) {
                startIndex = 0;
            } else if (startIndex < 0) {
                startIndex = str.length() + startIndex;
            }
            if (endIndex == null) {
                endIndex = str.length();
            } else if (endIndex < 0) {
                endIndex = str.length() + endIndex;
            }
        }
        if (startIndex.equals(endIndex)) {
            return "";
        }
        StringBuilder sb = new StringBuilder();
        for (int i = startIndex; step > 0 ? i < endIndex : i > endIndex; i += step) {
            char c = charAt(str, i);
            if (c != 0) {
                sb.append(c);
            }
        }
        return sb.toString();
    }
}
